package com.zjsru.oneday202208;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
 * @Author: likew
 * @Date: 2022/8/7
 *
 * 函数的独占时间:以数组形式返回每个函数的 独占时间 ，其中第 i 个下标对应的值表示标识符 i 的函数的独占时间。
 *
 * 输入：n = 2, logs = ["0:start:0","1:start:2","1:end:5","0:end:6"]
 * 输出：[3,4]
 * 解释：
 * 函数 0 在时间戳 0 的起始开始执行，执行 2 个单位时间，于时间戳 1 的末尾结束执行。
 * 函数 1 在时间戳 2 的起始开始执行，执行 4 个单位时间，于时间戳 5 的末尾结束执行。
 * 函数 0 在时间戳 6 的开始恢复执行，执行 1 个单位时间。
 * 所以函数 0 总共执行 2 + 1 = 3 个单位时间，函数 1 总共执行 4 个单位时间。
 *一个函数被调用两次，一次调用执行 2 单位时间，另一次调用执行 1 单位时间，那么该函数的 独占时间 为 2 + 1 = 3 。另一个执行调用一次， 独占时间为4，所以返回数组【3，4】
 */
public class ExclusiveTime {
    public int[] exclusiveTime(int n, List<String> logs) {
        int[] ans = new int[n];
        Deque<Integer> deque = new ArrayDeque<>();
        int cur = -1;
        for (String log : logs) {
            String[] ss = log.split(":");
            int idx = Integer.parseInt(ss[0]), ts = Integer.parseInt(ss[2]);
            if(ss[1].equals("start")){
                if(!deque.isEmpty()){
                    // 遇到一次start，计算栈顶元素占用的时间
                    ans[deque.peekLast()] += ts - cur;
                }
                deque.addLast(idx);
                cur = ts;
            }else {
                // 遇到一次end，计算栈顶元素占用的时间，并弹出
                int func = deque.pollLast();
                ans[func] += ts - cur + 1;
                cur = ts + 1;
            }
        }
        return ans;
    }
    
    public static void main(String[] args) {
        ExclusiveTime exclusiveTime = new ExclusiveTime();
        int n = 2;
        List<String> logs = new ArrayList<String>();
        logs.add("0:start:0");
        logs.add("1:start:2");
        logs.add("1:end:5");
        logs.add("0:end:6");
        System.out.println(exclusiveTime.exclusiveTime(n, logs));
    }
}
